# # 实例方法
#
# class Person():
#
#     def __init__(self):
#         self.name = '坚果'
#         # self.HP = 2000
#
# class Hero():
#
#     jineng_num = 4
#     def __init__(self):
#         self.name = '盖伦'
#         self.HP = 2000
#
#     # 普通实例方法
#     def fun_1(self):
#         print("{}的血量是{}".format(self.name, self.HP))
#
#     @classmethod
#     def class_fun_1(cls):
#         """
#         类方法,第一个参数是类
#         :return:
#         """
#         print("技能数量有{}个".format(cls.jineng_num))
#
#     @staticmethod
#     def static_fun_1():
#         """
#         静态方法,没有默认传类或者对象
#         :return:
#         """
#         print("执行静态方法")

# 实例方法的调用
# 可以通过类直接调用,但是:1-方法中必须要传一个对象, 2-实例方法如果使用了属性或方法的时候,要注意传参传入的对象必须要有相关的属性值和方法
# jianguo = Person()
# Hero.fun_1(jianguo)
# # 通过对象调用
# gailun = Hero()  # 首先实例化一个对象
# gailun.fun_1()  # 对象.方法名的方式直接调用

# 类方法的调用
# 通过类直接调用类方法
# Hero.class_fun_1()
# 通过对象调用类方法
# gailun = Hero()  # 首先实例化一个对象
# gailun.class_fun_1()  # 对象.类方法的方式,直接调用

# # 静态方法的调用
# Hero.static_fun_1()  # 静态方法可以直接被类调用
# gailun = Hero()
# gailun.static_fun_1()  # 静态方法可以直接被对象调用

# # 私有方法
# class Pythonautotest:
#
#     def __addmoney(self):
#         """
#         私有方法
#         :return:
#         """
#         self.__money=30000
#         print(f"涨薪拉！！！我当前的薪资{self.__money}")
#
#     def study(self):
#         print("努力学习!")
#         # 在类的内部,可以直接使用私有方法
#         self.__addmoney()


# laoxy = Pythonautotest()
# # 类的外部访问
# # 私有方法不能由对象在外部直接调用
# laoxy.__addmoney()
# # 私有方法不能由类在外部直接调用
# Pythonautotest.__addmoney()
# jianguo = Pythonautotest() # 实例化一个对象
# jianguo.study()


# class Hero(object):
#     """定义了一个英雄类，可以移动和攻击"""
#     # Python 的类里提供的，两个下划线开始，两个下划线结束的方法，就是魔法方法，__init__()就是一个魔法方法，通常用来做属性初始化 或 赋值 操作。
#     # 如果类面没有写__init__方法，Python会自动创建，但是不执行任何操作，
#     # 如果为了能够在完成自己想要的功能，可以自己定义__init__方法，
#     # 所以一个类里无论自己是否编写__init__方法 一定有__init__方法。
#
#     def __init__(self, name, hp, atk, armor=100):
#         """ 方法，用来做变量初始化 或 赋值 操作，在类实例化对象的时候，会被自动调用"""
#         self.name = name # 姓名
#         self.hp = hp # 生命值
#         self.atk = atk  # 攻击力
#         self.armor = armor  # 护甲值
#         # __init__方法里面,不能使用return返回非空数据
#         # return self.name
#
#     def move(self):
#         """实例方法"""
#         print("正在前往事发地点...")
#
#     def attack(self):
#         """实例方法"""
#         self.move()
#         print("发出了一招强力的普通攻击...")
#
# # tdme1 = Hero('泰达米尔', 1800, 200, 80)
# # gailun = Hero('盖伦', 2400, 120, 140)
# # xiaopao = Hero('小炮', 2000, 180)
# # print(xiaopao.armor)
# # print(tdme1.name)
# # print(tdme1.hp)
# # print(tdme1.atk)
# # print(tdme1.armor)
# # print(gailun.name)
# # print(gailun.hp)
# # print(gailun.atk)
# # print(gailun.armor)
# # xiaopao.attack()
#
# tdme1 = Hero('泰达米尔', 1800, 200, 20)
# gailun = Hero('盖伦', 2400, 120, 20)
# print(id(tdme1.armor))
# print(id(gailun.armor))


class Hero(object):

    # 初始化方法
    # 创建完对象后会自动被调用
    def __init__(self, name):
        print('__init__方法被调用')
        self.name = name

    # 当对象被删除时，会自动被调用
    def __del__(self):
        print("__del__方法被调用")
        print("%s 被 GM 干掉了..." % self.name)

gailun = Hero('盖伦')  # 实例化对象-盖伦

gailun1 = gailun
gailun2 = gailun

del gailun
print("-------------------------")
del gailun1
print("-------------------------")
del gailun2
print("-------------------------")
